#pragma once
#include<Arduino.h>
#include<ESP8266WiFi.h>
#include "BH1750.hpp"
#include "wifi.hpp"
#include "remote_logger.hpp"
#include "http_server.hpp"
#include "pwm.h"

namespace ganix {
    namespace config
    {
        bool _bh_1750_enbale = false;
        bool _wifi_enable = false;
        bool _wifi_ap = false;
        bool _logger_enable = false;
        bool _rpc_enable = false;
        bool _http_server_enable = false;
        int _http_server_port = 80;
        String _wifi_ssid, _wifi_passwd;
        int _baud = 115200;
        String _logger_server = "";

        void enable_bh1750() {
            _bh_1750_enbale = true;
        }

        void enable_wifi(const String &ssid, const String &passwd, bool is_ap = false) {
            _wifi_ssid = ssid;
            _wifi_passwd = passwd;
            _wifi_enable = true;
            _wifi_ap = is_ap;
        }

        void enable_logger(const String &server) {
            _logger_server = server;
            _logger_enable = true;
        }

        void enable_rpc() {
            _rpc_enable = true;
        }

        void enable_http_server(int port = 80) {
            _http_server_enable = true;
            _http_server_port = port;
        }

        void set_baud(int baud = 115200) {
            _baud = baud;
        }

        bool is_enabled(String name) {
            return 
                name == "bh_1750"   && _bh_1750_enbale  ||
                name == "wifi"      && _wifi_enable     ||
                name == "logger"    && _logger_enable   ||
                name == "rpc"       && _rpc_enable
            ;
        }

        void start_init() {
            Serial.begin(_baud);
            if (_bh_1750_enbale)    singleton::init_bh1750();
            if (_wifi_enable){
                if (_wifi_ap) 
                    wifi::wifi_ap(_wifi_ssid, _wifi_passwd);
                else
                    wifi::wifi_connect(_wifi_ssid, _wifi_passwd);
            }
            if (_logger_enable)     singleton::init_logger(_logger_server);
            if (_http_server_enable) http_server::init(_http_server_port);
            pwm::init();
            //if (_rpc_enable)        singleton::init_rpc();
        }
    } // namespace config
} // namespace ganix
